import { contextBridge, ipcRenderer, IpcRendererEvent, OpenExternalOptions } from 'electron'

/**
 * 1.渲染器进程到主进程（单向） 例如 show-context-menu 事件
 *    ipcRenderer.send  ==>   ipcMain.on
 * 2.渲染器进程到主进程（双向）,渲染器进程代码调用主进程模块并等待结果(Promise) 例如 getPlatform 事件
 *    ipcRenderer.invoke  ==>   ipcMain.handle
 *    2.1 旧方法，避免使用 例如 setTitle 事件 和 onAsyncReply 事件
 *        ipcRenderer.send  ==>   ipcMain.on ==> event.reply
 * 3.主进程到渲染器进程 例如 update-counter 事件
 *    mainWindow.webContents.send  ==>  ipcRenderer.on
 */


// 安全地暴露 API 给渲染进程
contextBridge.exposeInMainWorld('electronAPI', {
  getPlatform: () => ipcRenderer.invoke('get-platform'),
  nodeVersion: () => process.versions.node,
  chromeVersion: () => process.versions.chrome,
  electronVersion: () => process.versions.electron,
  openFile: () => ipcRenderer.invoke('dialog:openFile'),
  setTitle: (title: string) => ipcRenderer.send('set-title', title),

  // 异步监听事件
  onAsyncReply: (callback: (response: string) => void) => {
    const listener = (_event: IpcRendererEvent, response: string) => {
      callback(response)
    }
    ipcRenderer.on('set-title-reply', listener)
    return () => {
      ipcRenderer.removeListener('set-title-reply', listener)
    }
  },

  onUpdateCounter: (callback: (value: number) => void) => {
    const listener = (_event: IpcRendererEvent, value: number) => callback(value)
    ipcRenderer.on('update-counter', listener)
    return () => {
      ipcRenderer.removeListener('update-counter', listener)
    }
  },

  // 右键菜单事件
  showContextMenu: () => ipcRenderer.send('show-context-menu'),

  // 文件资源管理器打开文件夹
  showItemInFolder: (path: string) => {
    ipcRenderer.send('show-item-in-folder', path)
  },

  // 外部应用程序中打开链接
  openExternal: (url: string, options?: OpenExternalOptions) => {
    ipcRenderer.send('open_external', url, options)
  },

})